package controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import model.vos.Articulo;
import view.ViewConsolaArticulo;
import view.ViwerConsola;
import model.ArticuloDao;
import model.ProductoDao;
import model.vos.Producto;

public class CArticuloConsola {

	private ProductoDao modelo;// modelo
	private ArticuloDao modeloArticulo;// modelo
	private Producto producto = new Producto();// entidad
	
	private ArrayList<Articulo>listArticulosDisponibles;//lista de articulos disponibles para vender

	private ViewConsolaArticulo vista;//vista

	public CArticuloConsola(ProductoDao modelo, ViwerConsola view) {
		this.modelo = modelo;
		this.vista = (ViewConsolaArticulo) view;
	}

	public CArticuloConsola() {
		this.modelo = new ProductoDao();
		this.vista = new ViewConsolaArticulo();
	}

	public Articulo altaOneArticulo() throws Exception {
		Articulo art=null;
		art= vista.viewSaveArticulo();
		producto.buildArticulo();
		producto.setArticulo(art);
		producto.buildCodigo();
		modelo.saveProducto(producto);
		vista.viewQuantityMoreArticulos();
		return art;
	}

	public void altaMoreArticulos() throws Exception {
		producto.buildArticulo();
		Articulo art = vista.viewSaveArticulo();
		producto.setArticulo(art);
		producto.buildCodigo();
		modelo.saveProducto(producto);
		int numero = vista.viewQuantityMoreArticulos();
		for (int i = 1; i < numero; i++) {
			producto.buildArticulo();
			Articulo newArt = (Articulo) producto.getArticulo();
			newArt.setNombre(art.getNombre());
			newArt.setDescripcion(art.getDescripcion());
			newArt.setPrecio(art.getPrecio());
			producto.buildCodigo();
			modelo.saveProducto(producto);
		}
	}
	
	public boolean venderUnArticulo() throws Exception {
		boolean isComplete = false;
		modeloArticulo = new ArticuloDao();
		if(listArticulosDisponibles == null){
			listArticulosDisponibles = (ArrayList<Articulo>) modeloArticulo.findAllArticulo();
		}

		producto.buildArticulo();
		Articulo art = viewArticulosParaAgragarlos();
		if(art != null){
			producto.setArticulo(art);
			modeloArticulo.stockRemove(art);
			modeloArticulo.remove(art.getId());
			vista.msgArticuloVendido();
			isComplete = true;
		}
		return isComplete;
	}
	
	
	private Articulo viewArticulosParaAgragarlos() throws IOException{
		Articulo art = null;
		ArrayList<Articulo> artList;
		
		vista.viewListArticulos(listArticulosDisponibles);
		/*
		 * Si la lista es mayor a 0 entonces puede selecciona uno
		 * */
		if(listArticulosDisponibles.size() > 0){
			/*
			 * El objeto seleccionado lo toma de la base de datos para compararlo con el que esta 
			 * en el la lista de disponibles*/
			//artList = (ArrayList<Articulo>) busca.findArticuloByNameExactly(vista.viewSelectedArticulo().toUpperCase());
			artList = (ArrayList<Articulo>) searchInListDisponibles(vista.viewSelectedArticulo().toUpperCase());
			Iterator<Articulo> articuloItem = artList.iterator();
			/*
			 * Si el nombre seleecionado trae nombre de la base de datos entonces puede agregarlo al kit
			 * */
			if(articuloItem.hasNext()){
				art = (Articulo) articuloItem.next();
				/*
				 * Aqui compara el que trajo de la base de datos con el que esta en la lista de disponibles
				 * Si es igual lo remueve de la lista de disponibles para que ya no sea tomado en cuenta despues*/
				if(selectArticuloDisponible(art)){
					//aqui debe ir el articulo resultante
				}else{
					/*
					 * Muestra si hubo error al selecionar el Articulo y meterlo al kid
					 * o si ya no esta disponible en la lista*/
					vista.errorSelectedArticulo();
				}
			}else{
				/*
				 * Muestra un error si al buscar un articulo en la base de datos ya no existe*/
				vista.errorSelectedArticulo();
			}
		}
		return art;
	}
	
	/**
	 * Selecciona un articulo de la lista de Articulos disponibles lo agrega al kit y lo remueve de la lista de disponibles
	 * @author Manuel
	 * @return boolean si lo puedo remover con exito
	 * */
	private boolean selectArticuloDisponible(Articulo articulo){
		boolean isRemove = false;
		Iterator<Articulo> items = listArticulosDisponibles.iterator();
		
		while(items.hasNext()){
			Articulo art = items.next();
			if(art.getId().equals(articulo.getId())){
				isRemove =listArticulosDisponibles.remove(art);
				items = listArticulosDisponibles.iterator();
			}
		}
		return isRemove;
	}
	
	/**
	 * Busca un Articulo por nombre dentro de la lista de articulos disponibles 
	 * @author Manuel
	 * @return ArrayList<Articulo> de los articulos que coincidan con el nombre que esta recibiendo
	 * */
	private ArrayList<Articulo> searchInListDisponibles(String nameArticulo){
		Iterator<Articulo> items = listArticulosDisponibles.iterator();
		ArrayList<Articulo> articuloList = new ArrayList<Articulo>();
		while(items.hasNext()){
			Articulo art = items.next();
			if(art.getNombre().equals(nameArticulo)){
				articuloList.add(art);
			}
		}
		return articuloList;
	}
	
	/**
	 * @return the producto
	 */
	public Producto getProducto() {
		return producto;
	}

	/**
	 * @param producto the producto to set
	 */
	public void setProducto(Producto producto) {
		this.producto = producto;
	}

	/**
	 * @return the vista
	 */
	public ViewConsolaArticulo getVista() {
		return vista;
	}

	/**
	 * @param vista the vista to set
	 */
	public void setVista(ViewConsolaArticulo vista) {
		this.vista = vista;
	}
	
	public static void main(String args[]) throws Exception{
		CArticuloConsola facade = new CArticuloConsola();
		facade.altaMoreArticulos();
	}
}
